/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package trabalhoconclusaocurso;

import java.util.Random;

/**
 *
 * @author matheus
 */
public class ConstruaSolucoes {

    
    public void ConstruaSoluções(Formiga formiga[],  double matrizPesoCidade[][], double matrizInformacao[][]){
     
           
     try{
     
          //inicializando percurso
         formiga = inicializandoPercurso(formiga);
         //inicializando as cidades visitadas
         formiga = inicializandoCidadesVisitadas(formiga);
         //iniciando o primeiro percuro se colocando cada formiga em uma cidade
         formiga = iniciandoPercuso(formiga, 0);
      
       //constução do resto do caminho
            construcaoVetor(formiga, matrizPesoCidade,  matrizInformacao);


     }catch(Exception e){
         System.out.println("erro ConstruaSoluções");
     }
     }
    public void construcaoVetor(Formiga[] formiga,  double matrizCidade[][],  double matrizInfo[][]){

        //declaracao de variaveis           
           int vaga_vetor = 0;
          //declarando objetos
           ComputeRegraDecisao  computeRegraDecisao = new ComputeRegraDecisao();

         try{

               //Construcao do resto do caminho
                while(vaga_vetor < formiga.length - 1){//dando erro na vaga 5 -> tirei o -1
                  vaga_vetor = vaga_vetor + 1;

                   for(int unidadeFormiga = 0; unidadeFormiga < formiga.length; unidadeFormiga++){
                       computeRegraDecisao.ComputeRegraDecisao(unidadeFormiga, vaga_vetor, formiga, matrizInfo);
                    }
               }
               //setando a ultima cidade
                formiga = iniciandoPercuso(formiga, 5);// nao tava setando a ultima

               //calculo do percurso

               calculodoPercurso(formiga, matrizCidade);

               //saida
                Saida saida = new Saida();
                System.out.println("valores intermediarios");
                saida.imprimirCidadesVisitadas(formiga);
                saida.imprimirDistancia(formiga);
                saida.imprimirPercurso(formiga);
                System.out.println("valores intermediarios");
       }catch(Exception e){
           System.out.println("erro construcaoVetor");
       }

}
    private void calculodoPercurso(Formiga[] formiga, double[][] matrizCidade){
        double dist;
        try{
        for(int unidadeFormiga = 0; unidadeFormiga< formiga.length; unidadeFormiga++){
                    dist = computeDistPercuso(unidadeFormiga, matrizCidade, formiga);
                   formiga[unidadeFormiga].setDistanciaPercurso(dist);
               }
        }catch (Exception e) {
            System.out.println("erro  calculodoPercurso");
        }
    }
    private double computeDistPercuso(int unidadeFormiga, double cid[][], Formiga[] formiga) {
        int unFormiga = unidadeFormiga;
        double distcidade = 0;
        
        try{
            int[] percuso = formiga[unFormiga].getPercuso();

            for(int j = 0; j<formiga.length;j++){

                distcidade = distcidade + cid[percuso[j]][percuso[j+1]];
                //System.out.println("percuso 1 = "+percuso[j]+"  percuso 2 = "+percuso[j+1]);
            }

      
        }catch(Exception e){
            System.out.println("erro computeDistPercuso");
        }
          
        return distcidade;
    }
    public Formiga[] inicializandoCidadesVisitadas(Formiga[] f_miga){
      //declaracao variaveis
         Formiga[] f = f_miga;
        try{

           for (int unidadeFormiga = 0; unidadeFormiga < f.length; unidadeFormiga++){
               for(int unidadecidade = 0; unidadecidade <  f.length; unidadecidade++ ){
                   f[unidadeFormiga].setCidadesVisitadas(unidadecidade, false);
               }
           }

        }catch(Exception e){
            System.out.println("erro inicializandoCidadesVisitadas");
        }
       return f;
    }
    public Formiga[] inicializandoPercurso(Formiga[] f){
        //declarando variaveis
           Formiga[] form = f;

        try{

             for( int unidadeFormiga = 0; unidadeFormiga < form.length; unidadeFormiga++){
                  for(int j = 0; j <= form.length; j++){

                    form[unidadeFormiga].setPercurso(j, -1);//coloca a cidade r na vaga o da formiga 0
                  }
                }


        } catch(Exception e){
            System.out.println("erro inicializandoPercuso");
        }
           return form;
    }
    public Formiga[] iniciandoPercuso(Formiga[] f, int vag){
        //declarando variaveis
           Formiga[] form = f;
            
        try{

             for( int unidadeFormiga = 0; unidadeFormiga < form.length; unidadeFormiga++){
                  
                    form[unidadeFormiga].setPercurso(vag, unidadeFormiga);//coloca a cidade r na vaga o da formiga 0
                    form[unidadeFormiga].setCidadesVisitadas(unidadeFormiga, true);//marca que a formiga passou na cidade
              
           }
        } catch(Exception e){
            System.out.println("erro inicializandoPercuso");
        }

        return form;
    }
    
}


